\section{Métodos}
\subsection{Implementación}
La implementación se realizó sobre el archivo client.py. La lógica de paquetes entrantes se encuentra en el método handle\_incoming. El server sólo envia paquetes ACK, y hay tres tipos de paquetes a los cuales puede estar respondiendo ese ACK: SYN, FIN y datos. \\

Si se recibió un ACK del SYN, se establece la conexión y se cambia al estado ESTABLISHED. Si el ACK pertenece a un FIN, se cambia el estado a CLOSED y se cierra la conexión. Para todos los casos, se reconocen cierto número de paquetes dependiendo el \#ACK recibido. Estos paquetes reconocidos se remueven de la lista de retransmisión y se ajusta la ventana apropiadamente. \\

Para manejar los timeouts se utiliza el método handle\_timeout. Se mantiene internamente un diccionario de \{\#SEQ, \#retransimiciones\}. Al llegar un timeout, se obtienen todos los paquetes de la cola de retransmisión. Luego se intenta retransimitir cada uno de estos paquetes, incrementando en 1 su valor de retransmisiones en el diccionario. Si se llega a cierto máximo permitido de retransmisiones, se cierra la conexión y devuelve un error. \\

Para manejar la ventana deslizante, en la clase ClientControlBlock se implementaron varios métodos simples. Para comprobar si es posible enviar paquetes, el método send\_allowed verifica si el número de secuencia del paquete a enviar no supera al valor superior de la ventana actual. Para aceptar un paquete entrante, en accepts() se verifica si el número de secuencia esté entre los límites de la ventana. Y finalmente, para reajustar la ventana, readjust\_window toma un parámetro como valor inferior de la ventana. El superior será ese valor sumado al tamaño de la ventana de emisión. \\
\newpage
\subsection{Experimentación}
La experimentación se basó en realizar envíos de mensajes de distintos tamaños, modificando inclusive el tamaño de la ventana de emisión (SEND\_WINDOW). Nos enfocamos en medir:

\begin{itemize}
	\item Tiempo de transmisión
	\item Cantidad de retransmisiones
\end{itemize}

Todas estas mediciones las hicimos promediando varias corridas y viendo la transmición de paquetes con Wireshark. \\

Medir correctamente estas propiedades no fue del todo simple, ya que no teniamos una noción de cuando terminaba la transmisión de datos más allá de lo que podiamos observar con Wireshark. El problema principal era que, para poder sacar promedios había que correr varias veces un test y al correr más de una prueba en un lapso corto de tiempo, los paquetes se mezclaban con pruebas anteriores. \\

Una forma de solucionar estos problemas fue crear un send bloqueante. La idea era que, una vez que se empieza a enviar datos, no se devuelve el control al programa hasta que no termine el envio. De esta forma, podemos automatizar pruebas sin que se mezclen los paquetes. La implementación se basa en checkear si están vacios el buffer outgoing y la cola de retransmisión del cliente. \\

Para realizar los experimentos que requieren cambiar el tamaño de la ventana nos parecio conveniente darle esa funcionalidad al cliente. Se implementó en el cliente un método change\_window\_size y lo utilizamos antes de enviar datos en cada corrida. \\

Todos los experimentos fueron realizados con el server y el client en la misma PC con la misma IP.